package it.unipg.bipod.web;

import java.io.IOException;

import javax.faces.bean.*;
import it.unipg.bipod.applicationLogic.*;

/**
 * Managed Bean per la pagina di login di BiPoD.
 * 
 * @author Lorenzo Porzi
 *
 */
@ManagedBean(name="login")
@SessionScoped
public class LoginBean extends DefaultBean {
	// Proprietà per l'interfaccia
	private String nomeUtente;
	private String password;
	
	// Altre proprietà
	private Application application;
	
	/**
	 * Costrutture. Imposta stringhe vuote come username e password.
	 */
	public LoginBean() {
		setNomeUtente("");
		setPassword("");
	}
	
	// Getters e Setters
	
	public void setNomeUtente(String nomeUtente) {
		this.nomeUtente = nomeUtente;
	}
	
	public String getNomeUtente() {
		return nomeUtente;
	}
	
	public void setPassword(String password) {
		this.password = password;
	}
	
	public String getPassword() {
		return password;
	}
	
	public void setApplication(Application application) {
		this.application = application;
	}

	public Application getApplication() {
		return application;
	}
	
	// Navigazione
	
	/**
	 * Esegue il login utilizzando username e password forniti.
	 */
	public String login() {
		try {
			Application app = AuthManager.login(nomeUtente, password);
			
			if (app == null) {
				addWarnMessage(getSettings().getProperty("msgLoginNonRiuscito"));
				
				return null;
			} else if (app instanceof SegretarioApplication) {
				setApplication(app);
				
				return "/segretario/bandi?faces-redirect=true";
			} else if (app instanceof DocenteApplication) {
				setApplication(app);
				
				return "/docente/bandi?faces-redirect=true";
			}
			
			addWarnMessage(getSettings().getProperty("msgErroreGenerico"));
			return null;
		} catch (AuthException e) {
			if (e instanceof UtenteNonRegistratoException)
				addWarnMessage(getSettings().getProperty("msgUtenteNonRegistrato"));
			else if (e instanceof UtenteNonAttivoException)
				addWarnMessage(getSettings().getProperty("msgUtenteNonAttivo"));
			else
				//addWarnMessage(getSettings().getProperty("msgErroreGenerico"));
				addWarnMessage(e.toString());
			
			return null;
		}
	}
	
	/**
	 * Esegue il logout invalidando la sessione corrente.
	 * 
	 * @throws IOException
	 */
	public void logout() throws IOException {
		getContext().getExternalContext().invalidateSession();
		this.application = null;
	}
	
	public boolean getAutenticato() {
		return application != null;
	}
}
